package cl.mt.data;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.util.Collection;
import java.util.LinkedList;

import cl.mt.dto.DTOUsuario;
import cl.mt.util.bd.DatosTabla;
import cl.mt.util.bd.Parametro;

public class DataUsuario extends DatosTabla {
	private static final String sqlGetId = "SELECT MAX(ID)+1 AS IDX FROM MT.MST_USUARIOS";
	private static final String sqlFindByPK = "SELECT ID, NOMBRE, APELLIDO, ESTADO, NOMBRE_USUARIO, CONTRASENIA, EMP_ID, MAIL, PRF_ID, PLA_ID, CANT_PUBLICACIONES, CNT_ID, ELIMINADO, COMUNA, MOVIL, TELEFONO, CARGO, FAX, OPERADOR_TELEFONICO, RUT, TERMINO_CONDICIONES, ISADMIN, FECHA_REGISTRACION, OPT_ID, IND_ENVIA_CORREO FROM MT.MST_USUARIOS where ID=?";
	private static final String sqlFindAll = "SELECT ID, NOMBRE, APELLIDO, ESTADO, NOMBRE_USUARIO, CONTRASENIA, EMP_ID, MAIL, PRF_ID, PLA_ID, CANT_PUBLICACIONES, CNT_ID, ELIMINADO, COMUNA, MOVIL, TELEFONO, CARGO, FAX, OPERADOR_TELEFONICO, RUT, TERMINO_CONDICIONES, ISADMIN, FECHA_REGISTRACION, OPT_ID, IND_ENVIA_CORREO FROM MT.MST_USUARIOS";
	private static final String sqlCreate = "INSERT INTO (ID, NOMBRE, APELLIDO, ESTADO, NOMBRE_USUARIO, CONTRASENIA, EMP_ID, MAIL, PRF_ID, PLA_ID, CANT_PUBLICACIONES, CNT_ID, ELIMINADO, COMUNA, MOVIL, TELEFONO, CARGO, FAX, OPERADOR_TELEFONICO, RUT, TERMINO_CONDICIONES, ISADMIN, FECHA_REGISTRACION, OPT_ID, IND_ENVIA_CORREO) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
	private static final String sqlDeleteByPK = "DELETE FROM MT.MST_USUARIOS where ID=?";


	private DTOUsuario setDatosRegistro(ResultSet rs) throws SQLException {
		DTOUsuario dto = new DTOUsuario();
		dto.setId(formatInteger(rs.getObject("ID")));
		dto.setNombre(formatString(rs.getObject("NOMBRE")));
		dto.setApellido(formatString(rs.getObject("APELLIDO")));
		dto.setEstado(formatString(rs.getObject("ESTADO")));
		dto.setUsername(formatString(rs.getObject("NOMBRE_USUARIO")));
		dto.setPassword(formatString(rs.getObject("CONTRASENIA")));
		dto.setIdEmpresa(formatInteger(rs.getObject("EMP_ID")));
		dto.setMail(formatString(rs.getObject("MAIL")));
		dto.setIdPerfil(formatInteger(rs.getObject("PRF_ID")));
		dto.setIdPlan(formatInteger(rs.getObject("PLA_ID")));
		dto.setCantidadPublicaciones(formatInteger(rs.getObject("CANT_PUBLICACIONES")));
		dto.setIdContacto(formatInteger(rs.getObject("CNT_ID")));
		dto.setEliminado(formatString(rs.getObject("ELIMINADO")));
		dto.setComuna(formatString(rs.getObject("COMUNA")));
		dto.setCelular(formatString(rs.getObject("MOVIL")));
		dto.setTelefono(formatString(rs.getObject("TELEFONO")));
		dto.setCargo(formatString(rs.getObject("CARGO")));
		dto.setFax(formatString(rs.getObject("FAX")));
		dto.setOperadorTelefonico(formatString(rs.getObject("OPERADOR_TELEFONICO")));
		dto.setRut(formatString(rs.getObject("RUT")));
		dto.setTerminoCondiciones(formatString(rs.getObject("TERMINO_CONDICIONES")));
		dto.setAdministrador(formatString(rs.getObject("ISADMIN")));
		dto.setFechaRegistro(formatDate(rs.getDate("FECHA_REGISTRACION")));
		dto.setIdOperadorTelefonico(formatInteger(rs.getObject("OPT_ID")));
		dto.setEnvioCorreo(formatString(rs.getObject("IND_ENVIA_CORREO")));
		return dto;
	}

	public Integer generateId() {
		Parametro[] params = null;
		Integer id = null;
		try {
			getConnection();
			ResultSet rs = executeQuery(sqlGetId, params);
			while (rs.next()) {
				id = formatInteger(rs.getObject("IDX"));
			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			closeConnection();
		}
		return id;
	}
	public DTOUsuario findByPrimaryKey(Long id) {

		DTOUsuario dto = new DTOUsuario();
		Parametro[] params = new Parametro[] { getParametro(id, Types.INTEGER)};
		try {
			getConnection();

			ResultSet rs = executeQuery(sqlFindByPK, params);
			while (rs.next()) {
				dto = setDatosRegistro( rs );
			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			closeConnection();
		}

		return dto;
	}

	public Collection findAll() {

		Parametro[] params = null;
		Collection col = new LinkedList();
		try {
			getConnection();

			ResultSet rs = executeQuery(sqlFindAll, params);
			while (rs.next()) {
				DTOUsuario dto = setDatosRegistro( rs );
				col.add( dto );
			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			closeConnection();
		}

		return col;
	}

	public int deleteByPrimaryKey(Integer id) {

		Parametro[] params = new Parametro[] { getParametro(id, Types.INTEGER)};
		int res = -1;
		try {
			getConnection();
			res = executeUpdate(sqlDeleteByPK, params);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			closeConnection();
		}

		return res;
	}

	public int create(DTOUsuario dto) {

		Parametro[] params = new Parametro[] {
			getParametro(dto.getId(), Types.INTEGER),
			getParametro(dto.getNombre(), Types.VARCHAR),
			getParametro(dto.getApellido(), Types.VARCHAR),
			getParametro(dto.getEstado(), Types.VARCHAR),
			getParametro(dto.getUsername(), Types.VARCHAR),
			getParametro(dto.getPassword(), Types.VARCHAR),
			getParametro(dto.getIdEmpresa(), Types.INTEGER),
			getParametro(dto.getMail(), Types.VARCHAR),
			getParametro(dto.getIdPerfil(), Types.INTEGER),
			getParametro(dto.getIdPlan(), Types.INTEGER),
			getParametro(dto.getCantidadPublicaciones(), Types.INTEGER),
			getParametro(dto.getIdContacto(), Types.INTEGER),
			getParametro(dto.getEliminado(), Types.VARCHAR),
			getParametro(dto.getComuna(), Types.VARCHAR),
			getParametro(dto.getCelular(), Types.VARCHAR),
			getParametro(dto.getTelefono(), Types.VARCHAR),
			getParametro(dto.getCargo(), Types.VARCHAR),
			getParametro(dto.getFax(), Types.VARCHAR),
			getParametro(dto.getOperadorTelefonico(), Types.VARCHAR),
			getParametro(dto.getRut(), Types.VARCHAR),
			getParametro(dto.getTerminoCondiciones(), Types.VARCHAR),
			getParametro(dto.getAdministrador(), Types.VARCHAR),
			getParametro(dto.getFechaRegistro(), Types.DATE),
			getParametro(dto.getIdOperadorTelefonico(), Types.INTEGER),
			getParametro(dto.getEnvioCorreo(), Types.VARCHAR)
		};

		int res = -1;
		try {
			getConnection();
			res = executeUpdate(sqlCreate, params);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			closeConnection();
		}

		return res;
	}



}

